package com.sfx.other.Generics;

import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: sfx
 * Date: 2023-09-09
 * Time: 9:02
 */
public class DynamicArray<E> {
    private static final int DEFAULT_CAPACITY = 10;
    private int size;
    private Object[] elementData;
    public DynamicArray() {
        this.elementData = new Object[DEFAULT_CAPACITY];
    }
    private void ensureCapacity(int minCapacity) {
        int oldCapacity = elementData.length;
        if(oldCapacity >= minCapacity){
            return;
        }
        int newCapacity = oldCapacity * 2;
        if(newCapacity < minCapacity)
            newCapacity = minCapacity;
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
    public void add(E e) {
        ensureCapacity(size + 1);
        elementData[size++] = e;
    }
    public E get(int index) {
        return (E)elementData[index];
    }
    public int size() {
        return size;
    }
    public E set(int index, E element) {
        E oldValue = get(index);
        elementData[index] = element;
        return oldValue;
    }

    /**
     * 限定参数T 是E本身或者子类
     * @param c
     * @param <T>
     */
//    public <T extends E> void addAll(DynamicArray<T> c) {
//        for(int i=0; i<c.size; i++){
//            add(c.get(i));
//        }
//    }


    /**
     * 通配符表达式
     * 可以匹配 E或者E的子类型
     * @param c
     */
    public void addAll(DynamicArray<? extends E> c) {
        for(int i=0; i<c.size; i++){
            add(c.get(i));
        }
    }

//    public static <T> void swap(DynamicArray<T> arr, int i, int j){
//        T tmp = arr.get(i);
//        arr.set(i, arr.get(j));
//        arr.set(j, tmp);
//    }

    private static <T> void swapInternal(DynamicArray<T> arr, int i, int j){
        T tmp = arr.get(i);
        arr.set(i, arr.get(j));
        arr.set(j, tmp);
    }

    public static void swap(DynamicArray<?> arr, int i, int j){
        swapInternal(arr, i, j);
    }

    public static <D,S extends D> void copy(DynamicArray<D> dest,
                                            DynamicArray<S> src){
        for(int i=0; i<src.size(); i++){
            dest.add(src.get(i));
        }
    }

//    public static <D> void copy(DynamicArray<D> dest,
//                                DynamicArray<? extends D> src){
//        for(int i=0; i<src.size(); i++){
//            dest.add(src.get(i));
//        }
//    }

    public void copyTo(DynamicArray<? super E> dest){
        for(int i=0; i<size; i++){
            dest.add(get(i));
        }
    }

    /**
     * 不能将DynamicArray<Integer>  看做是 DynamicArray<Number>
     * @param args
     */
    public static void main(String[] args) {
        DynamicArray<Integer> ints = new DynamicArray<Integer>();
        ints.add(100);
        ints.add(34);
        DynamicArray<Number> numbers = new DynamicArray<Number>();
        ints.copyTo(numbers);
    }
}
